package org.tools.gson;

import java.lang.reflect.Type;
import java.util.Date;

import org.tools.common.BeanUtil;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonElement;

import net.sf.json.JSONObject;

/** 
 * Gson的帮助类
 *
 * <pre> 
 * 构建组：e-tools
 * 作者：eddy
 * 邮箱：1546077710@qq.com
 * 日期：2017年4月23日-下午6:01:36
 * 版权：E源时代
 * </pre>
 */
public class GsonUtil {
	
	/**
	 * jsonObject 生成一个class对象.
	 * 
	 * @param jsonObject
	 * @param cls
	 * @return C
	 */
	public static <C> C toBean(JSONObject jsonObject, Class<C> cls) {
		return toBean(jsonObject.toString(), cls);
	}

	/**
	 * 获取序列化Gson对象。
	 * 
	 * @return Gson对象
	 */
	private static Gson getGson() {
		GsonBuilder gsonBuilder = new GsonBuilder();
		gsonBuilder
				.registerTypeAdapter(String.class, new JsonObjectSerializer())
				.registerTypeAdapter(Date.class, new DateSerializer())
				.registerTypeAdapter(Boolean.class, new BooleanSerializer())
				.addDeserializationExclusionStrategy(
						new SuperclassExclusionStrategy())
				.addSerializationExclusionStrategy(
						new SuperclassExclusionStrategy());
		Gson gson = gsonBuilder.create();
		return gson;
	}

	/**
	 * 把jsonStr生成一个class对象
	 * 
	 * @param jsonStr  json字符串
	 * @param cls class对象
	 * @return C
	 */
	@SuppressWarnings("unchecked")
	public static <C> C toBean(String jsonStr, Class<C> cls) {
		if (cls.equals(String.class))
			return (C) jsonStr;
		C o = (C) getGson().fromJson(jsonStr, cls);
		return o;
	}

	/**
	 * 转换jsonStr为java bean。
	 * <pre>
	 * 	例:new TypeToken&lt;ArrayList&lt;SysServiceParam>>(){}.getType()
	 * </pre>
	 * 
	 * @param jsonStr
	 *            json格式的字符串
	 * @param type
	 *            待转换类型(可以是泛型)
	 * 
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public static <C> C toBean(String jsonStr, Type type) {
		return (C) getGson().fromJson(jsonStr, type);
	}

	/**
	 * 将对象转化为JsonElement
	 * 
	 * @param obj
	 * @return
	 */
	public static JsonElement toJsonTree(Object obj) {
		return getGson().toJsonTree(obj);
	}

	/**
	 * 按照指定格式获取json对象中的属性值
	 * 
	 * @param jobject
	 *            json对象
	 * @param key
	 *            指定属性
	 * @param defaultVal
	 *            默认值
	 * @param cls
	 *            返回格式
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public static <C> C getValue(JSONObject jobject, String key,
			Object defaultVal, Class<C> cls) {
		Object object = jobject.get(key);
		if (BeanUtil.isEmpty(object)) {
			if (defaultVal != null) {
				return toBean(defaultVal.toString(), cls);
			} else {
				return null;
			}
		}
		if (String.class.equals(cls)) {
			return (C) object.toString();
		}
		return toBean(object.toString(), cls);
	}
}
